// 实现使用一个布尔值来表示锁是否被占用，以及一个数组来存储等待获取锁的 Promise
// 当一个任务获取锁时，如果锁未被占用，它将直接进入临界区；
// 如果锁已被占用，它将创建一个 Promise 并将其添加到等待数组中。

// 当一个任务释放锁时，如果有等待的任务，它将唤醒第一个等待的任务；
// 如果没有等待的任务，它将设置锁为未被占用状态。

class SimpleLock {

    constructor(){
        this.locked = false,
        this.waiting = []
    }

    async acquireLock(){
        if (!this.locked) {
           this.locked = true;
           return;
        } else {
            // 锁被占用了, 返回一个 pending 状态的 Promise
            return new Promise((resolve) => {
                console.log("枷锁中...")
                this.waiting.push(resolve)
            })
        }
    }

    relaseLock(){
        if (this.locked && this.waiting.length > 0) {
            const nextResolve = this.waiting.shift()
            nextResolve()
        } else {
            this.locked = false
        }
    }
}

module.exports = SimpleLock